local function_list =_G.ServerOHOH.function_list
local M=_G.ServerOHOH.class.new(script,  _G.ServerOHOH.files.Server_PlayerComponent(),script.Parent.Name);
local Tool=require(script.Parent.tool)
local slotGoodsCfg=_G.CommonOHOH.config.Goods[810]
local Game_Cfg=_G.CommonOHOH.config.Game

function M.new(self,...)
	return M(self,...);
end;

function M.ctor(self, parent)
	M.super.ctor(self, parent);	
    self.DataStore=self.parent:GetComponent(_G.ServerOHOH.load.Server_PlayerDataComponent())
    self.ItemCtrl=parent:GetComponent(_G.ServerOHOH.load.Server_ItemCtrl());

    self.player=self.parent


    if self.player.character then
        self.player.character:AddPrivateComponent(script.BatleBro)
    end

    self.player.CharacterEnterEvent:Connect(function(character)
            character:AddPrivateComponent(script.BatleBro)
    end)

    --检测是否能购买槽位
    self.player.CanNotRobuxBuyEvent:Connect(function(gid,gtype,...)
        if gid==slotGoodsCfg.id then
            if self.DataStore:GetData("bro").slot>Game_Cfg.FriendSlots then
                return  true
            end
        end
    end)

    -- 发放槽位
    self.player.RobuxBuyDoneEvent:Connect(function(gid,gtype,...)
        if gid==slotGoodsCfg.id then
                local old= self.DataStore:GetData("bro").slot
                self.DataStore:GetData("bro").slot=slotGoodsCfg.itemData.bro_slot+old
                self.DataStore:Execut(function()
                self.player:SynchDataToClient("bro")
            end);
        
        end
    end)

    

end;

function M.dtor(self)
	M.super.dtor(self);
end;
function M.AddItem(self,data)
    self.ItemCtrl:AddItem(data)
end


--装备最佳好友：
-- 返回值：true，成功，false 失败
function M.EquipBest(self) 
    -- print("----S--EquipBest---------")
    local bro_had= self.DataStore:GetData("bro").__real.had
    local list=Tool.SortByPower(bro_had)
    local idList={}
    
    local canEquipCount=self.DataStore:GetData("bro").slot
    for _,v in pairs(list) do
        table.insert(idList,v.id)
        canEquipCount=canEquipCount-1
        if canEquipCount==0 then
            break
        end
    end
    -- local equip=self.DataStore:GetData("bro").equip

    self.DataStore:GetData("bro").equip=idList
    self.DataStore:Execut(function()
        -- equip.__real=idList
    end);

    self.player:SynchDataToClient("bro")
    return true
end


--卸载所有好友
-- 返回值：true，成功，false 失败
function M.UnEquipAll(self)
    -- print("----S--UnEquipAll---------")
    -- local equip= self.DataStore:GetData("bro").equip
    self.DataStore:GetData("bro").equip={}
    self.DataStore:Execut(function()
        -- equip.__real={}
    end);
    self.player:SynchDataToClient("bro")
    return true
end


--卸载好友:idList,传一个数组，如：{1，2，3}，
-- 返回值：true，成功，false 失败
function M.UnEquip(self,idList)
    -- print("----S--UnEquip---------")
    local canEquip={}
    for _,equiped in pairs(self.DataStore:GetData("bro").equip.__real) do
        -- print("-----UnEquip---",equiped)
        local isHad=false
        for _,j in pairs(idList) do
            if j==equiped then
                isHad=true
                break
            end
        end
        if not isHad then
            table.insert(canEquip,equiped)
        end
    end

    self.DataStore:GetData("bro").equip=canEquip

    self.DataStore:Execut(function()
        -- equip.__real=canEquip
    end);
    -- _G.ServerOHOH:PrintTable(canEquip)
    self.player:SynchDataToClient("bro")
    return true
end

--装备好友:idList,传一个数组，如：{1，2，3}，
-- 返回值：true，成功，false 失败，如果返回值是false，会附带错误码->  1：槽位已经满，2，去购买槽位，3 未知错误
function M.Equip(self,idList)
    -- print("----S--Equip---------")
    -- _G.ServerOHOH:PrintTable(idList)
    -- print("--------EQUIP---0----")
    -- _G.CommonOHOH:PrintTable(self.DataStore:GetData("broEquip").__real)

    local equip=self.DataStore:GetData("bro").equip.__real
    local errorCode=Tool.IsCanEquip(idList,equip,self.DataStore:GetData("bro").slot)
    -- print("--------EQUIP---1.1----")
    -- _G.CommonOHOH:PrintTable(self.DataStore:GetData("broEquip").__real)

    if errorCode>0 then
        return false, errorCode
    end
    for _,v in pairs(idList) do
        table.insert(equip,v)
    end

    -- print("--------EQUIP---1.2----")
    -- _G.CommonOHOH:PrintTable(self.DataStore:GetData("broEquip").__real)

    self.DataStore:GetData("bro").equip=equip

    self.DataStore:Execut(function()
        -- print("装备数据保存")
    end);
    -- print("--------EQUIP---1.5----")
    -- _G.CommonOHOH:PrintTable(self.DataStore:GetData("broEquip").__real)
    self.player:SynchDataToClient("bro")

    -- print("--------EQUIP---1----")
    -- _G.CommonOHOH:PrintTable(self.DataStore:GetData("broEquip").__real)
    
 
    return true
end

-- 售卖好友:idList,传一个数组，如：{1，2，3}
-- 返回值：true，成功，false 失败
function M.Sell(self,idList)
    local bro_had= self.DataStore:GetData("bro").__real.had

    local add=0
    local key=nil
    local adder=0
    for _,id in pairs(idList) do
        if bro_had[id] then
            adder,key=Tool.Calculate_sell(bro_had[id])
            add=add+adder
            bro_had[id]=nil
        else
            return false
        end
    end
    local equip=self.DataStore:GetData("bro").equip.__real


    local newEquip={}
    for index,equiped in pairs(equip) do
     
        local isHad=false
        for _,id in pairs(idList) do
            if equiped==id then
                isHad=true
                break
            end
        end

        if  not  isHad then
           table.insert(newEquip,equiped)
        end
    end

    self.DataStore:GetData("bro").equip=newEquip
    self.DataStore:GetData("bro").had=bro_had
    self:AddItem({[key]=add})

    local  deletList={}
    for k,v in pairs(self.DataStore:GetData("broEquip").__real) do
        if not bro_had[k]  then
            table.insert(deletList,k)
        end
    end
    
    if #deletList==0 then
        self.player:SynchDataToClient("bro")
    else
        for _, k in pairs(deletList) do
            self.DataStore:GetData("broEquip").__real[k]=nil
        end
        self.player:SynchDataToClient("bro","broEquip")
    end
   
    return true

end

-- 保存锁定状态
function M.SaveLockState(self,lockInfo)
    -- print("----S--SaveLockState---------")
    -- _G.ServerOHOH:PrintTable(lockInfo)
    local bro_had= self.DataStore:GetData("bro").__real.had

    for id,lock in pairs(lockInfo) do
        if bro_had[id] then
            bro_had[id].lock=lock
        end
    end
    self.DataStore:GetData("bro").had=bro_had
    self.DataStore:Execut(function()
    end);
    self.player:SynchDataToClient("bro")
    return true
end

-- 升级好友:idList,传一个数组，如：{1，2，3}
-- 返回值：true，成功，false 失败
function M.Upgrade(self,idList)
    local bro_had= self.DataStore:GetData("bro").__real.had
   local errorCode,sum,key= Tool.IsCanUpgrade(idList,bro_had,self.DataStore)
    if errorCode>0 then
        return false,errorCode
    end
    for _,id in pairs(idList) do
        bro_had[id].level=bro_had[id].level+1
    end

    self.DataStore:GetData("bro").had=bro_had
    self:AddItem({[key]=-sum})
    self.player:SynchDataToClient("bro")
    return true
end

function M.Feed(self,userId,guid,chapterId,levelId)
    local errorCode,sum,key= Tool.IsCanAwake(chapterId,levelId,self.DataStore)
    if  errorCode>0 then
        return false,errorCode
    end
    local bro_had= self.DataStore:GetData("bro").__real.had
    bro_had[guid]={
        userId=userId,
        level=1,
        baseLevel=Tool.GetBaseLevel(chapterId,levelId),
        lock=0,
    }
    self.DataStore:GetData("bro").had=bro_had


    self.DataStore:GetData("statistics").save=self.DataStore:GetData("statistics").save+1
    
    self.player.OnboardingFunnelEvent:Action("feed_1")


    self:AddItem({[key]=-sum})
    self.player:SynchDataToClient("bro")


    return true
end;


function M.Operate(self,opId,...)
    
    -- print("--------Operate---0----")
    -- _G.CommonOHOH:PrintTable(self.DataStore:GetData("broEquip").__real)

    if self.lastOpTime and tick()-self.lastOpTime<0.5 then
        return 
    end
    self.lastOpTime=tick()

    local fucId=opId
    assert(self[fucId],"opId==null:"..opId)
        
    -- print("--------Operate---1----")
    -- _G.CommonOHOH:PrintTable(self.DataStore:GetData("broEquip").__real)
   return  self[fucId](self,...)
end;

--购买槽位检查
function M.BuySlotCheck(self)
    return true
end
--购买槽位完成
function M.BuySlot(self)
    self.player:SynchDataToClient("bro")
end

M:RegistFunction(function_list.bro_operate,M.Operate)

return M